/**
 *
 */
package br.com.werp.regras.contabilidade.controle;

import br.com.werp.regras.geral.Algoritimo;
import br.com.werp.regras.geral.FabricaSubSistema;
import br.com.werp.regras.geral.Relatorio;
import br.com.werp.regras.geral.util.BeanUtil;
import br.com.werp.regras.geral.util.Constantes;
import br.com.werp.regras.geral.util.Dia;
import br.com.werp.regras.geral.util.JRDataSourcePadrao;
import br.com.werp.regras.geral.util.Util;
import br.com.werp.regras.geral.vos.contabilidade.ContaAnaliticaVO;
import br.com.werp.regras.geral.vos.contabilidade.LancamentoFormVO;
import br.com.werp.regras.geral.vos.contabilidade.LancamentoVO;
import br.com.werp.regras.geral.vos.contabilidade.LoteLancamentoReportVO;
import br.com.werp.regras.geral.vos.contabilidade.LoteLancamentoVO;
import br.com.werp.regras.geral.vos.contabilidade.LoteRelatorioVO;
import br.com.werp.regras.geral.vos.contabilidade.LoteVO;
import br.com.werp.regras.geral.vos.contabilidade.PesquisaLoteLancamentoFormVO;
import br.com.werp.regras.geral.vos.relatorio.RelatorioVO;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;


/**
 * @author Sobreira refact 30/11/2006
 * @author Rafael Carneiro - <a href = "mailto:rafael@portaljava.com">
 * rafael@portaljava.com</a>
 *
 * Apr 11, 2006
 */
public class ControleRelatorioLote {
    private ControleLancamento controleLancamento = new ControleLancamento();
    private ControleConta controleConta = new ControleConta();

    public RelatorioVO gerarRelatorioLotesLancamentos(Object form,
        String usuario, List lotes) throws Exception {
        List listaLotes = new ArrayList();
        LancamentoFormVO lancamentoFormVO = new LancamentoFormVO();
        BeanUtil.copiarVO(form, lancamentoFormVO);

        listaLotes.addAll(processarLotes(lancamentoFormVO, usuario, lotes));

        return gerarRelatorioLotesLancamentos(lancamentoFormVO, listaLotes);
    }

    public RelatorioVO gerarRelatorioLotesLancamentos(
        LancamentoFormVO lancamentoFormVO, List listaLotes)
        throws Exception {
        HashMap parametros = new HashMap();

        parametros.put(Relatorio.IMAGE_URI, "/contabilidade/imgJasper/");

        Map imagemMap = new HashMap();
        imagemMap.put(Relatorio.LOGO, "Logo.gif");

        Relatorio relatorio = FabricaSubSistema.getRelatorio();

        return relatorio.processarRelatorio(new JRDataSourcePadrao(listaLotes),
            "RelatorioLote", lancamentoFormVO.getTpRelatorio(), parametros,
            FabricaSubSistema.getContabilidade(), new HashMap(), imagemMap);
    }

    private List processarLotes(Object form, String usuario, List lotes)
        throws Exception {
        List retorno = new ArrayList();

        for (Iterator iter = lotes.iterator(); iter.hasNext();) {
            LoteRelatorioVO lotesForm = (LoteRelatorioVO) iter.next();

            retorno.addAll(processarRelatorioLote(lotesForm.getLote_cod()));
        }

        return retorno;
    }

    private List adaptarListaLoteVOListaLoteLancamentoReportVO(List lotes)
        throws Exception {
        List retorno = new LinkedList();

        for (Iterator iter = lotes.iterator(); iter.hasNext();) {
            LoteVO loteVO = (LoteVO) iter.next();
            List lancamnetos = loteVO.getLancamentos();

            for (Iterator iterator = lancamnetos.iterator();
                    iterator.hasNext();) {
                LancamentoVO lancamentoVO = (LancamentoVO) iterator.next();

                LoteLancamentoReportVO lancamentoReportVO =
                    new LoteLancamentoReportVO();

                lancamentoReportVO.setLanc_id(new Integer(
                        lancamentoVO.getLanc_id()));

                lancamentoReportVO.setLote_id(new Long(
                        ControleLancamento.gerarCodigoLote(
                            loteVO.getLote_data(), loteVO.getLote_serial())));

                ContaAnaliticaVO contaAnaliticaVO = new ContaAnaliticaVO();
                contaAnaliticaVO.setAnlt_id(lancamentoVO.getLanc_analitica());

                contaAnaliticaVO = (ContaAnaliticaVO) Util.get0(controleConta.pesquisarContasAnaliticas(
                            contaAnaliticaVO));

                lancamentoReportVO.setSint_descricao(contaAnaliticaVO.getSint_descricao());

                lancamentoReportVO.setLote_data(new Dia(loteVO.getLote_data()));
                lancamentoReportVO.setLanc_valor(new Double(
                        lancamentoVO.getLanc_valor()));
                lancamentoReportVO.setLanc_deb_crd("/" +
                    lancamentoVO.getLanc_deb_crd());
                lancamentoReportVO.setLanc_historico(lancamentoVO.getLanc_historico());

                lancamentoReportVO.setSint_resumido(new Integer(
                        contaAnaliticaVO.getSint_resumido()));
                lancamentoReportVO.setSint_contabil(contaAnaliticaVO.getSint_contabil());
                retorno.add(lancamentoReportVO);
            }
        }

        return retorno;
    }

    private List processarRelatorioLote(String loteCod)
        throws Exception {
        PesquisaLoteLancamentoFormVO pesquisaLoteLancamentoFormVO =
            new PesquisaLoteLancamentoFormVO();
        pesquisaLoteLancamentoFormVO.setLote_cod(loteCod);

        List retorno = new ArrayList();
        List lotes =
            controleLancamento.pesquisarLoteLancamento(pesquisaLoteLancamentoFormVO);

        for (Iterator iter = lotes.iterator(); iter.hasNext();) {
            LoteLancamentoVO lotesLancamentos = (LoteLancamentoVO) iter.next();

            LoteLancamentoReportVO lancamentoReportVO =
                new LoteLancamentoReportVO();
            lancamentoReportVO.setLanc_id(new Integer(
                    lotesLancamentos.getLanc_id()));

            lancamentoReportVO.setLote_id(new Long(
                    ControleLancamento.gerarCodigoLote(
                        lotesLancamentos.getLote_data(),
                        lotesLancamentos.getLote_serial())));

            ContaAnaliticaVO contaAnaliticaVO = new ContaAnaliticaVO();
            contaAnaliticaVO.setAnlt_id(lotesLancamentos.getLanc_analitica());

            contaAnaliticaVO = (ContaAnaliticaVO) Util.get0(controleConta.pesquisarContasAnaliticas(
                        contaAnaliticaVO));

            lancamentoReportVO.setSint_descricao(contaAnaliticaVO.getSint_descricao());

            lancamentoReportVO.setLote_data(new Dia(
                    lotesLancamentos.getLote_data()));
            lancamentoReportVO.setLanc_valor(new Double(
                    lotesLancamentos.getLanc_valor()));
            lancamentoReportVO.setLanc_deb_crd("/" +
                lotesLancamentos.getLanc_deb_crd());
            lancamentoReportVO.setLanc_historico(lotesLancamentos.getLanc_historico());

            lancamentoReportVO.setSint_resumido(new Integer(
                    contaAnaliticaVO.getSint_resumido()));
            lancamentoReportVO.setSint_contabil(contaAnaliticaVO.getSint_contabil());

            retorno.add(lancamentoReportVO);
        }

        return retorno;
    }

    public void manterListaRelatorioLancamento(Object form,
        List relatorioLancamento) throws Exception {
        Algoritimo algoritimo = FabricaSubSistema.getAlgoritimo();

        LancamentoFormVO lancamentoFormVO = new LancamentoFormVO();
        BeanUtil.copiarVO(form, lancamentoFormVO);

        if (lancamentoFormVO.getOperacao().equals(Constantes.ADICIONAR)) {
            LoteRelatorioVO loteRelatorioVO = new LoteRelatorioVO();
            loteRelatorioVO.setLote_cod(lancamentoFormVO.getLote_cod());

            lancamentoFormVO.setLote_cod(lancamentoFormVO.getLote_cod());

            List lotes =
                controleLancamento.pesquisarLoteLancamento(lancamentoFormVO);

            for (Iterator iter = lotes.iterator(); iter.hasNext();) {
                LoteLancamentoVO element = (LoteLancamentoVO) iter.next();
                loteRelatorioVO.setLote_data(new Dia(element.getLote_data()).toString());
            }

            relatorioLancamento.add(loteRelatorioVO);
        } else {
            algoritimo.removerIdVirtual(relatorioLancamento,
                lancamentoFormVO.getLancamentos());
        }
    }

    public static void main(String[] args) throws Exception {
        ControleRelatorioLote relatorio = new ControleRelatorioLote();

        LancamentoFormVO formVO = new LancamentoFormVO();

        Util.verRelartorio(relatorio.gerarRelatorioLotesLancamentos(formVO, "",
                null));
    }

    public RelatorioVO simularImportacaoFinanceiro(Object form, List documentos)
        throws Exception {
        ControleImportacaoFinanceiro controleImportacaoFinanceiro =
            new ControleImportacaoFinanceiro();
        LancamentoFormVO lancamentoFormVO = new LancamentoFormVO();
        BeanUtil.copiarVO(form, lancamentoFormVO);

        List listaLotes =
            controleImportacaoFinanceiro.gerarListaLoteImportacaoFinanceiro(form,
                documentos, null);

        return gerarRelatorioLotesLancamentos(lancamentoFormVO,
            adaptarListaLoteVOListaLoteLancamentoReportVO(listaLotes));
    }
}
